#ifndef _SEQLIST_h_
#define _SEQLIST_h_
 
#include <stdio.h>
#define MAXLEN 100
typedef  int elementType ;
 
typedef struct sList
{
    elementType data[MAXLEN];
    int len;           //有效长度
} seqList;
//初始化顺序表
void initList( seqList * L)
{
    L->len =0;
}
//1.求顺序表中第i个元素，存在返回1，否则返回0
int  getElement(seqList L,int i,elementType * x)
{
    if(i<1 || i>L.len)
    {
        printf("元素位置越界！\n");
        return 0;
    }
    else{
        *x=L.data[i-1];
        return 1;
    }
}
//2.在第i个结点前插入值为x的结点。
int listInsert(seqList * L, int i,elementType x)
{
    int j;
    if(i==MAXLEN)
    {
        printf("溢出\n");
        return 0;
    }
    else if(i<1 || i>L->len+1)
    {
        printf("序号超出范围,请重新输入\n");
        return 0;
    }
    else{
        for(j=L->len-1;j>=i-1;j--)
        {
            L->data[j+1]=L->data[j];
        }
        L->data[i-1]=x;
        L->len++;    //修改表的长度
        return 1;
    }
}
//3.删除顺序表中第i个元素结点。
int deleteKnot(seqList * L,int i)
{
    int j;
    if(L->len<=0)
    {
        printf("原表为空\n");
        return 0;
    }
    else if(i<1 || i>L->len)
    {
        printf("删除位置不在有效范围！\n");
        return 0;
    }
    else{
        for(j=i;j<L->len;j++)
        {
            L->data[i-1]=L->data[i];
        }
        L->len--;    //修改表的长度
        return 1;
    }
}
//4.在一个递增有序的顺序表L中插入一个值为x的元素，并保持其递增有序特性。
void insertOrderList(seqList * L,int x)
{
    int i=0;
    if(L->len==MAXLEN)
    {
        printf("链表已满，不能插入！\n");
        return;
    }
    while(L->data[i]<=x)
    {
        if(i==L->len)
        {
            break;
        }
        else{
            i++;
        }
    }
    listInsert(L,i+1,x);
}
//遍历顺序表
void print(seqList * L)
{
    int i;
    for (i=0;i<L->len;++i)
    {
        printf("%d  ",L->data[i]);
    }
    printf("\n");
}
//5.将顺序表Ｌ中的奇数项和偶数项结点分解开（元素值为奇数、偶数），分别放入新的顺序表中，然后原表和新表元素同时输出到屏幕上，以便对照求解结果。
void analyzeList(seqList * L,seqList * L1,seqList * L2)
{
    int k=0,i=0,j=0;
    for(i=0;i<L->len;++i)
    {
        if(L->data[i]%2==0)
        {
            while(j!=L->len)
            {
                 L1->data[j]=L->data[i];
                 L1->len++;
                 j++;
                 break;
            }
 
        }
        else{
            while(k!=L->len)
            {
                 L2->data[k]=L->data[i];
                 L2->len++;
                 k++;
                 break;
            }
 
        }
    }
 
}
//6.求两个递增有序顺序表L1和L2中的公共元素，放入新的顺序表L3中。
void commonList(seqList * L1,seqList * L2,seqList * L3)
{
    int i=0,p=0,q=0;     //p,q指针分别指向L1，L2
    while(p!=L1->len&&q!=L2->len)
    {
        if(L1->data[p]==L2->data[q])
        {
 
             while(i!=L1->len)
             {
                 L3->data[i]=L1->data[p];
                 L3->len++;
                 break;
            }
            i++;
            p++;
            q++;
        }
        else if(L1->data[p]<L2->data[q])
        {
            p++;
        }
        else{
            q++;
        }
    }
}
//7.删除递增有序顺序表中的重复元素，并统计移动元素次数
void deleteReaptElement(seqList * L)
{
    int cou=0,i=0,j=1;
    while(j!=L->len)
    {
        if(L->data[i]==L->data[j])
        {
            j++;
        }
        else{
            L->data[i+1]=L->data[j];
            i+=1;
            cou++;
        }
 
    }
    L->len=i+1;      //修改顺序表L的长度
    printf("移动元素次数为:%d  ",cou);
}
void scan(seqList * L)
{
	int i=1;
	scanf("%d",&i);
	while(i!=-1)
	{
		L->data[L->len]=i;
		L->len++;
		scanf("%d",&i);
	}
}
#endif // _SEQLIST_h_